﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Data.Common;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Kingdee.BOS;


namespace ReceiveProject
{
    public class IMPORTRECIVE
    {

        //新增B2C订单
        public string SAL_ReceiveBill(DataSet ds)
        {
            string result = "";
            string re_BillNo = "";
            string sCheck = "1";
            try
            {
                 //// K/3 Cloud业务站点URL
                //// using Kingdee.BOS.WebApi.Client; // (需引用Kingdee.BOS.WebApi.Client.dll)  Cloud 业务站点Url
                //ApiClient client = new ApiClient("http://WIN-QPA2HIRFFI6/K3Cloud/");  //这个地址同网页打开的客户端地址
                //// 调用登录接口：d
                //// 参数说明：
                //// dbid     : 数据中心id。到管理中心数据库搜索：
                ////            select FDataCenterId, * from T_BAS_DataCenter
                //// userName : 用户名
                //// password ：原始密码（未加密）
                //// loid     : 语言id，中文为2052，中文繁体为3076，英文为1033
                //object[] loginInfo = new object[] {
                //    "57b9a94ba0e16f",//帐套Id
                // "赵元甲",//用户名
                // "Duocai2016",//密码
                // 2052};//语言id
                ////调用登陆接口 参数 数据中心Id，用户名，密码，语言id
                //bool ret = client.Login("5b9f77d7c99d12", "赵元甲", "Duocai2016", 2052);
                InvokeHelper.DBID = "5b9f77d7c99d12";
                var login = InvokeHelper.Login();
                var iResult = JObject.Parse(login)["LoginResultType"].Value<int>();
                if (iResult != 1 && iResult != -5) // 登陆成功，开始保存数据  if (iResult == 1 || iResult == -5)
                {
                    //return "当前用户登录失败!";
                    throw new KDBusinessException("", "当前用户登录失败");
                }
                else
                {

                    string FDate = ds.Tables["ReceiveBill"].Rows[0]["FDate"].ToString();  //单据日期
                    string FSALEORGID = ds.Tables["ReceiveBill"].Rows[0]["FSALEORGID"].ToString();  //销售组织
                    string FSETTLEORGID = ds.Tables["ReceiveBill"].Rows[0]["FPAYUNIT"].ToString();  //结算组织
                    string FPAYORGID = ds.Tables["ReceiveBill"].Rows[0]["FPAYORGID"].ToString();  //收款组织
                    string FRECEIVEAMOUNTFOR_H = ds.Tables["ReceiveBill"].Rows[0]["FRECEIVEAMOUNTFOR_H"].ToString();//金额
                    string FPAYUNIT = ds.Tables["ReceiveBill"].Rows[0]["FPAYUNIT"].ToString();//客户
                    string FREMARK = ds.Tables["ReceiveBill"].Rows[0]["FREMARK"].ToString();//来源订单号\
                    
                    string FPAYUNITTYPE = "BD_Customer";

                    JObject jsonRoot = new JObject();

                    // NeedUpDateFields: 哪些字段需要更新？为空则表示参数中全部字段，均需要更新
                    jsonRoot.Add("NeedUpDateFields", new JArray(""));

                    // Model: 单据详细数据参数
                    JObject model = new JObject();
                    jsonRoot.Add("Model", model);

                    // 开始设置单据字段值
                    // 必须设置的字段：主键、单据类型、主业务组织，各必录且没有设置默认值的字段
                    // 特别注意：字段Key大小写是敏感的，建议从BOS设计器中，直接复制字段的标识属性过来

                    // 单据主键：必须填写，系统据此判断是新增还是修改单据；新增单据，填0
                    model.Add("FID", 0);
                    // 单据编号：可以忽略，由系统根据编码规则自动生成
                    model.Add("FBillNo", "");

                    // 单据类型:：必须填写，是基础资料字段  所有基础资料字段都按FNumber赋值，别用其他字段
                    JObject basedata = new JObject();
                    basedata.Add("FNumber", "SKDLX01_SYS");      //标准
                    model.Add("FBillTypeID", basedata);

                    //结算币别
                    basedata = new JObject();
                    basedata.Add("FNumber", "PRE001");  //只有本币
                    model.Add("FSettleCurrId", basedata);


                    // 结算组织：必须填写，是基础资料字段                                               
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYORGID);
                    model.Add("FSETTLEORGID", basedata);

                    // 收款组织：必须填写，是基础资料字段                                               
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYORGID);
                    model.Add("FPAYORGID", basedata);

                    // 销售组织：必须填写，是基础资料字段                                               
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYORGID);
                    model.Add("FSALEORGID", basedata);

                    // 往来类型
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYUNITTYPE);
                    model.Add("FCONTACTUNITTYPE", FPAYUNITTYPE);

                    //往来单位
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYUNIT);
                    model.Add("FCONTACTUNIT", basedata);

                    //付款单位类型
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYUNITTYPE);
                    model.Add("FPAYUNITTYPE", FPAYUNITTYPE);

                    //付款单位
                    basedata = new JObject();
                    basedata.Add("FNumber", FPAYUNIT);
                    model.Add("FPAYUNIT", basedata);
                    ///应收实收金额
                    //model.Add("FRECEIVEAMOUNTFOR_H", FRECEIVEAMOUNTFOR_H);
                    //model.Add("FREALRECAMOUNTFOR", FRECEIVEAMOUNTFOR_H);

                    // 汇率类型(FExchangeTypeId):基础资料
                    basedata = new JObject();
                    basedata.Add("FNumber", "HLTX01_SYS");
                    model.Add("FEXCHANGETYPE", basedata);

                    // 本位币（FLocalCurrId）：基础资料
                    basedata = new JObject();
                    basedata.Add("FNumber", "PRE001");
                    model.Add("FMAINBOOKCURID", basedata);


                    // 结算币别
                    basedata = new JObject();
                    basedata.Add("FNumber", "PRE001");
                    model.Add("FSETTLECUR", basedata);

                    model.Add("FREMARK", FREMARK);
                    //FREMARK

                    JArray entryRows = new JArray();
                    // 把单据体行集合，添加到model中，以单据体Key为标识   BOS里的分录标识明细信息
                    string entityKeys = "AR_RECEIVEBILL__FRECEIVEBILLENTRY";   //
                    model.Add(entityKeys, entryRows);
                    // 通过循环创建单据体行：示例代码仅创建一行

                    foreach (DataRow myRow in ds.Tables["ReceiveBillEntry"].Rows)
                     {
                         
                         string FRECTOTALAMOUNTFOR = ds.Tables["ReceiveBillEntry"].Rows[0]["FRECTOTALAMOUNTFOR"].ToString();  //单据日期
                         string F_PAEZ_FYX = ds.Tables["ReceiveBillEntry"].Rows[0]["F_SK_FYX"].ToString();  //来源我网店
                         string F_SK_JSFS = ds.Tables["ReceiveBillEntry"].Rows[0]["F_SK_JSFS"].ToString();  //结算方式

                         // 添加新行，把新行加入到单据体行集合
                         JObject entryRow = new JObject();
                         entryRows.Add(entryRow);

                         // 给新行，设置关键字段值
                         // 单据体主键：必须填写，系统据此判断是新增还是修改行
                         entryRow.Add("FEntryID", 0);
                         //结算方式             
                         basedata = new JObject();
                         basedata.Add("FNumber", F_SK_JSFS);
                         entryRow.Add("FSETTLETYPEID", basedata);

                         //收款用途             
                         basedata = new JObject();
                         basedata.Add("FNumber", "SFKYT02_SYS");
                         entryRow.Add("FPURPOSEID", basedata);
                         //应收金额

                         entryRow.Add("FRECTOTALAMOUNTFOR", decimal.Parse(FRECTOTALAMOUNTFOR));
                         entryRow.Add("FRECAMOUNTFOR_E", decimal.Parse(FRECTOTALAMOUNTFOR));

                         //费用项 
                         entryRow.Add("F_PAEZ_FYX", F_PAEZ_FYX);
                     }

                    string send = JsonConvert.SerializeObject(jsonRoot);

                    result = InvokeHelper.Save("AR_RECEIVEBILL", send);
                }
                JObject jo = (JObject)JsonConvert.DeserializeObject(result);
                string respones = jo["Result"]["ResponseStatus"]["IsSuccess"].ToString();
                if (respones.ToUpper() == "TRUE")
                {
                     re_BillNo = jo["Result"]["Number"].ToString();
                   
                     if ((sCheck + "").Trim() == "1")  //自动审核
                     {
                         Submit_SEORDEROUT(re_BillNo);
                         string rs_Audit = Audit_SEORDEROUT(re_BillNo);

                     }
                     return re_BillNo;
                }
                else

                {
                    
                    throw new KDBusinessException("", jo.ToString());
                }
            }
            catch (Exception exp)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("程序运行遇到了未知的错误：");
                sb.Append("错误提示：").AppendLine(exp.Message);
                sb.Append("错误堆栈：").AppendLine(exp.StackTrace);
                throw new KDBusinessException("", sb.ToString());
                  
            }
        }

        //提交接口
        public string Submit_SEORDEROUT(string FBillNo)
        {
            string result = "";
            
            var login = InvokeHelper.Login();
            var iResult = JObject.Parse(login)["LoginResultType"].Value<int>();
            if (iResult != 1 && iResult != -5)
            {
                return "当前用户登录失败!";
            }
            // 登陆成功，开始保存数据
            if (iResult == 1 || iResult == -5)
            {
                // 开始构建Web API参数对象
                // 参数根对象：包含Creator、NeedUpDateFields、Model这三个子参数
                // using Newtonsoft.Json.Linq;  // (需引用Newtonsoft.Json.dll)
                JObject jsonRoot = new JObject();
                jsonRoot.Add("CreateOrgId", 0);
                jsonRoot.Add("Numbers", FBillNo);    //单据编号

                // 无组件调用Web API接口服务，保存调拨出库
                string send = JsonConvert.SerializeObject(jsonRoot);
                InvokeHelper.DBID = "5b9f77d7c99d12";
                result = InvokeHelper.Submit("AR_RECEIVEBILL", send);

            }
            //判断返回的result记录
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);
            string respones = jo["Result"]["ResponseStatus"]["IsSuccess"].ToString();
            if (respones.ToUpper() == "TRUE")
            {
                return "1";
            }
            else
            {
                return result;
            }
        }

        //审核接口
        public string Audit_SEORDEROUT(string FBillNo)
        {
            string result = "";
            
            var login = InvokeHelper.Login();
            var iResult = JObject.Parse(login)["LoginResultType"].Value<int>();
            if (iResult != 1 && iResult != -5)
            {
                return "当前用户登录失败!";
            }
            // 登陆成功，开始保存数据
            if (iResult == 1 || iResult == -5)
            {
                // 开始构建Web API参数对象
                // 参数根对象：包含Creator、NeedUpDateFields、Model这三个子参数
                // using Newtonsoft.Json.Linq;  // (需引用Newtonsoft.Json.dll)
                JObject jsonRoot = new JObject();
                jsonRoot.Add("CreateOrgId", 0);
                jsonRoot.Add("Numbers", FBillNo);    //单据编号

                // 无组件调用Web API接口服务，保存调拨出库
                string send = JsonConvert.SerializeObject(jsonRoot);
                InvokeHelper.DBID = "5b9f77d7c99d12";
                result = InvokeHelper.Audit("AR_RECEIVEBILL", send);

            }
            //判断返回的result记录
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);
            string respones = jo["Result"]["ResponseStatus"]["IsSuccess"].ToString();
            if (respones.ToUpper() == "TRUE")
            {
                return "1";
            }
            else
            {
                return result;
            }
        }

    }
}
